3  Datos Vectoriales

Manejo y Representación de datos vectoriales

3.1 Introducción

Los datos vectoriales son uno de los tipos fundamentales en los que se representa la información espacial. Este formato se caracteriza por describir los elementos del espacio a través de puntos, líneas y polígonos. Cada uno de estos objetos puede tener atributos asociados que describen características adicionales como el uso del suelo, la densidad poblacional, o cualquier otra variable relevante para el análisis.

En políticas públicas, los datos vectoriales juegan un rol clave en la toma de decisiones, ya que permiten analizar la distribución espacial de fenómenos, desde la localización de infraestructuras hasta la incidencia de eventos sociales y delictivos. A través de las herramientas de análisis vectorial, es posible identificar patrones, relaciones espaciales y tomar decisiones fundamentadas sobre la planificación y gestión del territorio.

En este capítulo, utilizaremos la librería sf para la lectura y manipulación de datos vectoriales en R. Esta librería es ampliamente utilizada en la comunidad de análisis espacial debido a su eficiencia y su integración con otras herramientas como dplyr para el manejo de tablas de atributos.

Introducción

Tipos de Datos Vectoriales espaciales básicos

type description
POINT zero-dimensional geometry containing a single point
LINESTRING sequence of points connected by straight, non-self intersecting line pieces; one-dimensional geometry
POLYGON geometry with a positive area (two-dimensional); sequence of points form a closed, non-self intersecting ring; the first ring denotes the exterior ring, zero or more subsequent rings denote holes in this exterior ring
MULTIPOINT set of points; a MULTIPOINT is simple if no two Points in the MULTIPOINT are equal
MULTILINESTRING set of linestrings
MULTIPOLYGON set of polygons
GEOMETRYCOLLECTION set of geometries of any type except GEOMETRYCOLLECTION

Objetivos del Módulo

  • Manipulación de Datos Vectoriales
  • Operaciones Espaciales
  • Ejemplo de Delitos

3.2 Manipulación de Datos Vectoriales

Además de las geometrías espaciales, los datos vectoriales incluyen una tabla de atributos que contiene información adicional sobre cada objeto espacial. Esta tabla de atributos es esencial para realizar análisis más profundos, ya que nos permite filtrar, seleccionar, crear columnas nuevas y resumir los datos según diferentes criterios.

Para la manipulación de datos vectoriales se usará la sección de atributos que la estructura sf permite para lo cual utilizaremos la librería dplyr cómo si fuera un dataframe.

3.2.1 Lectura de Insumos

Al leer un archivo vectorial, obtenemos un objeto sf que combina tanto la geometría como la tabla de atributos.

El paquete sf facilita la importación de estos datos, que suelen estar en formatos como shapefile (.shp) o GeoJSON (.geojson), etc. la función nativa para esto es st_read(). Para los efectos prácticos de esta etapa se utilizará la base de datos del censo a nivel zonal a nivel nacional que en este caso esta almacenado bajo la estrucura rds nativa de R, pero manteniendo todos los atributos y geometrías espaciales.

Cargar librerías

# install.packages("sf") 
library(sf) # manipulación de datos vectoriales
library(dplyr) # manipulación de tablas de atributos
library(mapview) # visualización de mapas dinámicos
library(ggplot2) # gráficos
library(RColorBrewer) #paleta de colores
library(viridis) #paleta de colores
# sii_LC <- st_read("data/sii/sii_urbe_LC.shp")
zonas_censales <-  readRDS("data/censo/zonas_urb_consolidadas.rds")
Table 3.1: Registros de Zonas Censales del Censo 2017
REGION NOM_REGION PROVINCIA NOM_PROVIN COMUNA NOM_COMUNA URBANO DISTRITO LOC_ZON GEOCODIGO AREA COD_INE_15 COD_INE_16 VALIDO KM2 ESC_JH PERS M2_O M2_C DENS_HAB DENS_OF DENS_COM geometry
1 REGIÓN DE TARAPACÁ 14 TAMARUGAL 1405 PICA PICA 1 1 1405011001 9336400.3 1405011001 1405011001 TRUE 9.3364003 10.817377 3876 0.0000 0.0000 415.1493 0.0000 0.00000 MULTIPOLYGON (((-69.31192 -...
1 REGIÓN DE TARAPACÁ 14 TAMARUGAL 1401 POZO ALMONTE POZO ALMONTE 1 1 1401011001 1941994.2 1401011001 1401011001 TRUE 1.9419942 10.224880 2771 1476.0000 4093.0000 1426.8838 760.0435 2107.62731 MULTIPOLYGON (((-69.78591 -...
1 REGIÓN DE TARAPACÁ 14 TAMARUGAL 1401 POZO ALMONTE POZO ALMONTE 1 2 1401011002 3572254.9 1401011002 1401011002 TRUE 3.5722549 10.253158 6506 1905.0000 9696.0000 1821.2586 533.2766 2714.25201 MULTIPOLYGON (((-69.76215 -...
1 REGIÓN DE TARAPACÁ 14 TAMARUGAL 1404 HUARA HUARA 1 1 1404011001 603314.2 1404011001 1404011001 TRUE 0.6033142 9.523220 1082 0.0000 0.0000 1793.4270 0.0000 0.00000 MULTIPOLYGON (((-69.7696 -1...
1 REGIÓN DE TARAPACÁ 11 IQUIQUE 1107 ALTO HOSPICIO ALTO HOSPICIO 1 2 1107011002 2272129.2 1107011002 1107011002 TRUE 2.2721292 9.747321 4360 475.0686 180.6789 1918.9050 209.0852 79.51965 MULTIPOLYGON (((-70.09246 -...
1 REGIÓN DE TARAPACÁ 11 IQUIQUE 1107 ALTO HOSPICIO ALTO HOSPICIO 3 2 1107031002 5820325.8 1107031002 1107031002 TRUE 5.8203258 9.397516 7099 4003.6214 1008.7833 1219.6912 687.8690 173.32076 MULTIPOLYGON (((-70.05305 -...

3.2.2 Filtros y selección de columnas

Uno de los pasos más comunes en la manipulación de datos vectoriales es filtrar y seleccionar filas o columnas de la tabla de atributos, lo que permite centrarse en elementos específicos para análisis más detallados. Para efectos de practicar la manipulación de datos espaciales se creará un subset de la base de zonas censales de alguna provincia de Chile y se realizarán cálculos sencillos de densidad.

Filtrar

Operador Comparación Ejemplo Resultado
x | y x Ó y es verdadero TRUE | FALSE TRUE
x & y x Y y son verdaderos TRUE & FALSE FALSE
!x x no es verdadero (negación) !TRUE FALSE
isTRUE(x) x es verdadero (afirmación) isTRUE(TRUE) TRUE
 # zonas_censales$NOM_PROVIN %>% unique() %>% sort()
zonas <-  zonas_censales %>% 
  filter(NOM_PROVIN == "VALPARAÍSO") %>% 
  filter(URBANO %in% c("VIÑA DEL MAR", "VALPARAÍSO") )

# mapview::mapview(zonas, zcol = "PERS")
ggplot() +
  geom_sf(data = zonas, aes(fill = PERS), color =NA, 
          alpha=0.8,  size= 0.1)+
  scale_fill_distiller(palette= "YlGnBu", direction = 1)+
  ggtitle("Población Zonas Censales - Urbano" ) +
  theme_bw() +
  theme(panel.grid.major = element_line(colour = "gray80"), 
        panel.grid.minor = element_line(colour = "gray80"))
Figure 3.1: Zonas Censales de comunas de Valparaíso y Viña del Mar - Urbano

Selección de columnas

zonas <-  zonas %>% 
  dplyr::select(GEOCODIGO,NOM_REGION, NOM_PROVIN, 
                NOM_COMUNA, PERS, URBANO, ESC_JH)

Mutate

Cálculo de superficie por polígono

zonas <- zonas %>% 
  mutate(AREA = as.numeric(st_area(.))) %>% # en metros cuadrados
  mutate(AREA = AREA/10000) %>% # en hectárea cuadrada
  mutate(DENS_PERS= round(PERS/AREA, 1))

# zonas
ggplot() +
  geom_sf(data = zonas, aes(fill = PERS), color =NA, 
          alpha=0.8,  size= 0.1)+
  scale_fill_distiller(palette= "YlGnBu", direction = 1)+
  ggtitle("Población Zonas Censales - Urbano" ) +
  theme_bw() +
  theme(panel.grid.major = element_line(colour = "gray80"), 
        panel.grid.minor = element_line(colour = "gray80"))
ggplot() +
  geom_sf(data = zonas, aes(fill = DENS_PERS), color =NA, 
          alpha=0.8,  size= 0.1)+
  scale_fill_distiller(palette= "YlGnBu", direction = 1)+
  ggtitle("Densidad de Población Zonas Censales - Urbano" ) +
  theme_bw() +
  theme(panel.grid.major = element_line(colour = "gray80"), 
        panel.grid.minor = element_line(colour = "gray80"))

3.2.3 Resumen Estadísticos

El objetivo de este punto es que con bases de datos espaciales también se pueden hacer resúmenes estadísticos, como se hacen normalmente con bases de datos. Ahora, se creará tabla con las poblaciones y promedio de años de estudio del Jefe de Hogar en todas las comunas de Chile.

Un punto importante para generar esta tabla es eficiente eliminar la geometría para los cálculos ya que la salida será una tabla.

tab_com <- zonas_censales %>% 
  st_drop_geometry() %>% # eliminar geometría.
  group_by(NOM_COMUNA) %>% 
  summarise(POB_COM = sum(PERS, na.rm = T),
            ESC_JH_COM = round(mean(ESC_JH, na.rm= T), 1))
Table 3.2: Registros de Población y Escolaridad por Comuna
NOM_COMUNA POB_COM ESC_JH_COM
ALGARROBO 10880 12.1
ALHUÉ 2706 9.6
ALTO HOSPICIO 105065 10.4
ANCUD 28162 10.0
ANDACOLLO 9989 8.8
ANGOL 48608 10.1
ANTOFAGASTA 349983 12.2
ANTUCO 2038 9.2
ARAUCO 27274 9.8
ARICA 203132 11.5

3.2.4 Joining

En este caso agregaremos a la tabla de resultados comunales antes creada, a la base de la comuna de Viña del Mar y Valparaíso, utilizaremos la función left_join.

zonas <-  zonas %>% 
  left_join(tab_com, by = "NOM_COMUNA") %>% # Ojo con las veces que se hace esta operación
  mutate(DIF_EJH_COM = round(( ESC_JH-ESC_JH_COM), 2))
ggplot() +
  geom_sf(data = zonas, aes(fill = DIF_EJH_COM), color =NA, 
          alpha=0.8,  size= 0.1)+
  scale_fill_distiller(palette= "PRGn", direction = 1)+
  ggtitle("Diferencias Esc. Jefe Hogar Zona/Comuna - Urbano" ) +
  theme_bw() +
  theme(panel.grid.major = element_line(colour = "gray80"), 
        panel.grid.minor = element_line(colour = "gray80"))
Figure 3.2: Diferencias Esc. Jefe Hogar respecto comuna - Urbano

3.3 Operaciones Espaciales con sf

Las operaciones espaciales son el conjunto de herramientas que permiten realizar cálculos y transformaciones sobre los datos espaciales vectoriales. Estas operaciones son fundamentales para análisis de proximidad, intersección, disolución de fronteras y creación de buffers, entre otras.

Podemos clasificar las operaciones sobre geometrías en función de lo que toman como entrada y lo que devuelven como salida. En cuanto a la salida tenemos operaciones que devuelven:

  • predicates: una lógica que afirma una determinada propiedad es TRUE
  • measures: una cantidad (un valor numérico, posiblemente con unidad de medida)
  • transformations: nuevas geometrías generadas

y en cuanto a lo que operan, distinguimos las operaciones que son:

  • unary cuando trabajan en una única geometría
  • binary cuando trabajan con pares de geometrías
  • n-ary cuando trabajan con conjuntos de geometrías

3.3.1 Unary measures

Las medidas unarias devuelven una medida o cantidad que describe una propiedad de la geometría:

medida devuelve
dimension 0 para puntos, 1 para líneas, 2 para polígonos, posiblemente NA para geometrías vacías
area el área de una geometría
length la longitud de una geometría lineal

Ejemplo cuando calculamos el área de cada polígono de zona censal.

# st_area(zonas)

zonas <- zonas %>% 
  mutate(AREA = as.numeric(st_area(.))) %>% # en metros cuadrados
  mutate(AREA = AREA/10000) %>% # en hectárea cuadrada
  mutate(DENS_PERS= round(PERS/AREA, 1))

3.3.2 Unary predicates

Los predicados unitarios describen una determinada propiedad de una geometría. Los predicados is_simple, is_valid, y is_empty devolver respectivamente si una geometría es simple, válida o vacía. Dado un sistema de referencia de coordenadas, is_longlat devuelve si las coordenadas son geográficas o proyectadas. es(geometría, clase)` comprueba si una geometría pertenece a una clase determinada.

st_is_valid(zonas) %>% head(10)
 [1] TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE

3.4 Binary Predicates

Una lista de predicados binarios es:

predicado significado inverso de
contains Ninguno de los puntos de A está fuera de B within
contains_properly A contiene a B y B no tiene puntos en común con el límite de A
covers Ningún punto de B está en el exterior de A covered_by
covered_by Inverso de covers
crosses A y B tienen algunos pero no todos los puntos interiores en común
disjoint A y B no tienen puntos en común intersects
equals A y B son topológicamente iguales: el orden de los nodos o el número de nodos puede ser diferente; idéntico a A contiene B y A dentro de B
equals_exact A y B son geométricamente iguales, y tienen el mismo orden de nodos
intersects A y B no son disjuntos disjoint
is_within_distance A está más cerca de B que una distancia dada
within Ninguno de los puntos de B está fuera de A contains
touches A y B tienen al menos un punto en el límite en común, pero ningún punto interior
overlaps A y B tienen algunos puntos en común; la dimensión de estos es idéntica a la de A y B
relate Dado un patrón de máscara, devuelve si A y B se adhieren a este patrón

La página DE-9IM de Wikipedia proporciona los patrones relate para cada uno de estos verbos. Es importante importante comprobarlos; por ejemplo, covers y contains (y sus (y sus inversos) no suelen ser del todo intuitivos:

  • si A contiene B, B no tiene puntos en común con el exterior o frontera de A
  • si A cubre B, B no tiene puntos en común con el exterior de A

3.4.1 Unary transformers

Las transformaciones unarias funcionan por geometría y devuelven para cada geometría una nueva geometría.

transformador devuelve una geometría …
centroid de tipo POINT con el centroide de la geometría
buffer que es más grande (o más pequeña) que la geometría de entrada, dependiendo del tamaño del buffer
jitter que ha sido movida en el espacio una cierta cantidad, usando una distribución uniforme bivariada
wrap_dateline cortada en piezas que ya no cruzan ni cubren la línea de cambio de fecha
boundary con el límite de la geometría de entrada
convex_hull que forma el envolvente convexo de la geometría de entrada
line_merge después de unir elementos LINESTRING conectados de un MULTILINESTRING en LINESTRINGs más largos
make_valid que es válida
node con nodos añadidos a geometrías lineales en las intersecciones sin nodo; solo funciona en geometrías lineales individuales
point_on_surface con un (arbitrario) punto en una superficie
polygonize de tipo polígono, creada a partir de líneas que forman un anillo cerrado
segmentize una geometría (lineal) con nodos a una densidad o distancia mínima dada
simplify simplificada mediante la eliminación de vértices/nodos (líneas o polígonos)
split que ha sido dividida con una línea divisoria
transform transformada o convertida a un nuevo sistema de referencia de coordenadas
triangulate con polígonos triangulados de Delaunay
voronoi con la teselación de Voronoi de una geometría de entrada
zm con coordenadas Z y/o M eliminadas o añadidas
collection_extract con sub-geometrías de un GEOMETRYCOLLECTION de un tipo particular
cast que se convierte a otro tipo
+ que se desplaza sobre un vector dado
* que se multiplica por un escalar o matriz
Figure 3.3: Para un conjunto de puntos, izquierda: Convex Hull (rojo); centro: Polígonos de Voronoi; derecha: triangulación de Delauney

Transformación de CRS

Los sistemas de coordenadas forman la base de cálculo para describir la posición de un punto a partir de mediciones geodésicas: distancias, proporciones de distancias (sin escala) y ángulos. Las coordenadas nunca pueden medirse, solamente se calculan con referencia un sistema de coordenadas bien definido.

Para el caso de Chile usamos dos sistemas de referencias de coordenadas:

Coordenadas elipsoidales (geodésicas):

4326 o "+proj=longlat +datum=WGS84 +no_defs"

Coordenadas proyectadas (métricas):

32719 o "+proj=utm +zone=19 +south +datum=WGS84 +units=m +no_defs"

Las medidas unarias devuelven una medida o cantidad que describe una propiedad de la geometría:

Reproyectar Vectores

zonas_utm <- zonas %>% st_transform(32719)
# st_crs(zonas_utm)
# st_is_empty(zonas_utm) %>% table()

Unión de Polígonos

Primeramente se creará una geometría comunal basándose en las zonas censales utilizando la función st_union()

valpo_com <-  zonas %>% filter(NOM_COMUNA == "VALPARAÍSO") %>% 
  st_union()
ggplot() +
  geom_sf(data = zonas, aes(fill = DIF_EJH_COM), color =NA, 
          alpha=0.3,  size= 0.1)+
  scale_fill_distiller(palette= "PRGn", direction = 1)+
  geom_sf(data = valpo_com,  color ="magenta", alpha=1,  size= 1, fill = NA)+
  ggtitle("Resaltar la comuna de Valparaíso" ) +
  theme_bw() +
  theme(panel.grid.major = element_line(colour = "gray80"), 
        panel.grid.minor = element_line(colour = "gray80"))
Figure 3.4: Resaltar la comuna de Valparaíso

Buffer

Aplicación de Buffer con la función de st_buffer, que tiene el parámetro distque dice relación a los metros que se quiere hacer el buffer (también puede ser negativo)

#buffer exterior cuando el valor  de dist es positivo
valpo_com_buffer <-  valpo_com %>% 
  st_buffer(dist = 1000) # %>% st_simplify(dTolerance = 100) 

#buffer interior cuando el valor de dist es negativo
valpo_com_buffer_menos <-  valpo_com %>% 
  st_buffer(dist = - 500) # %>% st_simplify(dTolerance = 100) 
ggplot() +
  geom_sf(data = valpo_com,  color ="magenta", alpha=0.3,  size= 1, fill = "magenta")+
  geom_sf(data = valpo_com_buffer,  color ="orange", alpha=1,  size= 1, fill = NA)+
  geom_sf(data = valpo_com_buffer_menos,  color ="red", alpha=1,  size= 1, fill = NA)+
  ggtitle("Buffer de la comuna de Valparaíso - 1000 mts." ) +
  theme_bw() +
  theme(panel.grid.major = element_line(colour = "gray80"), 
        panel.grid.minor = element_line(colour = "gray80"))
Figure 3.5: Buffer de la comuna de Valparaíso 1000 y 500 metros.

Transformaciones Binarias

Los transformadores binarios son funciones que devuelven una geometría basada en operar sobre un par de geometrías. Incluyen:

función devuelve operador infijo
intersection las geometrías superpuestas para un par de geometrías &
union la combinación de las geometrías; elimina límites internos y puntos, nodos o segmentos de línea duplicados |
difference las geometrías de la primera después de eliminar la superposición con la segunda geometría /
sym_difference las combinaciones de las geometrías después de eliminar donde se intersectan; la negación (opuesto) de intersection %/%

3.5 Ejemplo de Delitos

En esta sessión se realizará un flujo de trabajo para el análisis de delitos a nivel comunal utilizando R. Que contempla desde la lectura de la base de información (excel de delitos), agregar información de categorías, hacer filtros, resúmenes estadísticos (tablas dinámicas) y finalmente visualizaciones gráficas y espaciales.

3.5.1 Lectura de una tabla

Se leerá el archivo excel que se vio la semana pasada de delitos comunales.

library(openxlsx) # trabajar con archivos Excel
library(plotly) # gráficos dinámicos
delitos_tbl <- read.xlsx("data/excel/delitos_comunales.xlsx")

# str(delitos_tbl)

ver los primeros 6 registros

head(delitos_tbl)
  REGION                       NOM_REGION PROVINCIA  NOM_PROVIN COMUNA
1     05             REGIÓN DE VALPARAÍSO       056 SAN ANTONIO  05602
2     13 REGIÓN METROPOLITANA DE SANTIAGO       135   MELIPILLA  13502
3     08                REGIÓN DEL BIOBÍO       083      BIOBÍO  08314
4     01               REGIÓN DE TARAPACÁ       011     IQUIQUE  01107
5     03                REGIÓN DE ATACAMA       033      HUASCO  03302
6     10              REGIÓN DE LOS LAGOS       102      CHILOÉ  10202
       NOM_COMUNA PERSONAS Tipo.Participante Subgrupo HOMBRE_delitos
1       ALGARROBO    13794           VICTIMA Abigeato              0
2           ALHUÉ     6365           VICTIMA Abigeato              1
3     ALTO BIOBÍO     5823           VICTIMA Abigeato              2
4   ALTO HOSPICIO   106297           VICTIMA Abigeato              0
5 ALTO DEL CARMEN     5280           VICTIMA Abigeato              0
6           ANCUD    38845           VICTIMA Abigeato              9
  MUJER_delitos TOTAL_delitos
1             0             0
2             0             1
3             3             5
4             0             0
5             0             0
6             1            10

3.6 Agregar Categoría

Categorizar los Delitos:

Primeros veremos los tipos de delitos que existen, contenidos en la columna Subgrupo:

unique(delitos_tbl$Subgrupo)
[1] "Abigeato"                           "Abusos sexuales"                   
[3] "Amenazas con armas"                 "Amenazas o riña"                   
[5] "Animales sueltos en la vía pública" "Auxilio al suicidio"               
  • Se muestran los primeros 6 solo para buena visualización en el libro digital, en la práctica deben existir 50 categorias de delitos.

Crear una categoría de delitos

Se debe crear un grupo de delitos de su interés (Puede elegir los que usted quiera). Para este ejemplo se seleccionarán los delitos de violentos.

#guardo los delitos violentos en un vector
d_agrupados <- c( "Lesiones graves o gravísimas", "Lesiones menos graves",
                  "Microtráfico de sustancias", "Otros homicidios",
                  "Robo con homicidio", "Robo violento de vehículo motorizado",
                  "Robos con violencia o intimidación", "Tráfico de sustancias")

# leves o incivilidades
# d_agrupados <- c( "Amenazas con armas", "Amenazas o riña", 
#                   "Desórdenes públicos", "Comercio ilegal" , 
#                   "Consumo de alcohol y drogas en la vía pública", 
#                   "Daños", "Lesiones leves" , "Desórdenes públicos",
#                   "Desórdenes públicos", "Ofensas al pudor",
#                   "Porte de arma cortante o punzante","Receptación",
#                   "Robo de objetos de o desde vehículo",
#                   "Robo por sorpresa" )

Agregar Categoría de delitos

Para esto crearemos una nueva columna con la función mutate()

delitos_tbl <- delitos_tbl %>% 
  mutate(grupo = ifelse(Subgrupo %in% d_agrupados, TRUE, FALSE))


# head(delitos_tbl)

count(delitos_tbl, grupo)
  grupo     n
1 FALSE 28980
2  TRUE  5520
dim(delitos_tbl)
[1] 34500    13

3.7 Filtros

Filtrar por Tipo de Participante

delitos_filtered <- delitos_tbl %>% 
  filter(Tipo.Participante == "VICTIMA")

Filtrar por Región

# * Pueden cambiar la región
delitos_filtered <- delitos_filtered %>% 
  filter(NOM_REGION == "REGIÓN DE LA ARAUCANÍA")

Filtrar por Categortía

delitos_filtered <- delitos_filtered %>% 
  filter(grupo == T)

3.8 Generar Resúmenes (similar a tablas dinámicas)

Se buscará replicar desde R las operaciones correspondientes a esta tabla dinámica

tabla_resumen <- delitos_filtered %>% 
  group_by(NOM_COMUNA) %>% 
  summarise(total_delitos = sum(TOTAL_delitos),
            pob = min(PERSONAS))
  
tabla_resumen
# A tibble: 32 × 3
   NOM_COMUNA total_delitos   pob
   <chr>              <dbl> <dbl>
 1 ANGOL                147 52958
 2 CARAHUE               38 24458
 3 CHOLCHOL              33 11581
 4 COLLIPULLI           108 24439
 5 CUNCO                 19 17275
 6 CURACAUTÍN            33 17253
 7 CURARREHUE            13  7361
 8 ERCILLA               53  7704
 9 FREIRE                67 24390
10 GALVARINO             31 11914
# ℹ 22 more rows

Ponderar por población

tabla_resumen <- tabla_resumen %>% 
  mutate(pond_poblacion = total_delitos / pob) %>% 
  mutate(del_10000_hab = pond_poblacion * 10000) %>% 
  mutate(del_10000_hab = round(del_10000_hab,2))  # redondear con 2 decimales

head(tabla_resumen)
# A tibble: 6 × 5
  NOM_COMUNA total_delitos   pob pond_poblacion del_10000_hab
  <chr>              <dbl> <dbl>          <dbl>         <dbl>
1 ANGOL                147 52958        0.00278          27.8
2 CARAHUE               38 24458        0.00155          15.5
3 CHOLCHOL              33 11581        0.00285          28.5
4 COLLIPULLI           108 24439        0.00442          44.2
5 CUNCO                 19 17275        0.00110          11  
6 CURACAUTÍN            33 17253        0.00191          19.1

3.9 Visualización gráfica

g_barra <- ggplot(tabla_resumen, aes(x = NOM_COMUNA, y = del_10000_hab)) +
  geom_bar(fill = "#6a51a3", color =  "gray90", stat = "identity", width = 0.7)+
  coord_flip()+
  theme_bw()+
  labs(title="Delitos Violentos en la Región de la Araucanía", 
       y ="Delitos Violentos / 10000 hebitantes", x = "Nombre de Comuna")+
  theme(plot.title = element_text(face = "bold",colour= "gray20", size=12)) 
  
g_barra

Guardar el gráfico de barras como imagen

ggsave(plot = g_barra, filename = "images/del_violentos_R09.png", width = 8, height = 7)

Generar gráfico dinámico

ggplotly(g_barra)

3.10 Visualización Espacial

Primero se debe unir la tabla resumen delitos con Shapefile de comunas del INE.

Leer Shapefile de comunas

comunas_r09 <- st_read("data/shape/Comunas_Chile.shp") %>% 
  filter(NOM_REGION == "REGIÓN DE LA ARAUCANÍA")
Reading layer `Comunas_Chile' from data source 
  `/Users/denisberroeta/Documents/Docencia/Goblab/geoanalisis_book/data/shape/Comunas_Chile.shp' 
  using driver `ESRI Shapefile'
Simple feature collection with 346 features and 9 fields
Geometry type: MULTIPOLYGON
Dimension:     XY
Bounding box:  xmin: -3701691 ymin: 3734031 xmax: 705926.2 ymax: 8065316
Projected CRS: WGS 84 / UTM zone 19S
head(comunas_r09)
Simple feature collection with 6 features and 9 fields
Geometry type: MULTIPOLYGON
Dimension:     XY
Bounding box:  xmin: 105710.9 ymin: 5678347 xmax: 264088.7 ymax: 5814662
Projected CRS: WGS 84 / UTM zone 19S
  OBJECTID REGION             NOM_REGION PROVINCIA NOM_PROVIN COMUNA NOM_COMUNA
1      196     09 REGIÓN DE LA ARAUCANÍA       091     CAUTÍN  09102    CARAHUE
2      197     09 REGIÓN DE LA ARAUCANÍA       091     CAUTÍN  09116   SAAVEDRA
3      198     09 REGIÓN DE LA ARAUCANÍA       091     CAUTÍN  09121   CHOLCHOL
4      199     09 REGIÓN DE LA ARAUCANÍA       091     CAUTÍN  09106  GALVARINO
5      200     09 REGIÓN DE LA ARAUCANÍA       092    MALLECO  09211   VICTORIA
6      201     09 REGIÓN DE LA ARAUCANÍA       092    MALLECO  09202 COLLIPULLI
  Shape_Leng Shape_Area                       geometry
1   2.906029 0.13808364 MULTIPOLYGON (((121386.1 57...
2   1.208166 0.04046546 MULTIPOLYGON (((116508.5 57...
3   1.231271 0.04440834 MULTIPOLYGON (((154657.2 57...
4   1.466943 0.05865461 MULTIPOLYGON (((169736.5 57...
5   2.049851 0.12969648 MULTIPOLYGON (((200422.2 57...
6   2.832457 0.13410231 MULTIPOLYGON (((195536.1 58...

Unir shafile con tabla resumen

Se utilizará la función left_join

comunas_r09 <- comunas_r09 %>% 
  left_join(tabla_resumen, by = "NOM_COMUNA")

head(comunas_r09)
Simple feature collection with 6 features and 13 fields
Geometry type: MULTIPOLYGON
Dimension:     XY
Bounding box:  xmin: 105710.9 ymin: 5678347 xmax: 264088.7 ymax: 5814662
Projected CRS: WGS 84 / UTM zone 19S
  OBJECTID REGION             NOM_REGION PROVINCIA NOM_PROVIN COMUNA NOM_COMUNA
1      196     09 REGIÓN DE LA ARAUCANÍA       091     CAUTÍN  09102    CARAHUE
2      197     09 REGIÓN DE LA ARAUCANÍA       091     CAUTÍN  09116   SAAVEDRA
3      198     09 REGIÓN DE LA ARAUCANÍA       091     CAUTÍN  09121   CHOLCHOL
4      199     09 REGIÓN DE LA ARAUCANÍA       091     CAUTÍN  09106  GALVARINO
5      200     09 REGIÓN DE LA ARAUCANÍA       092    MALLECO  09211   VICTORIA
6      201     09 REGIÓN DE LA ARAUCANÍA       092    MALLECO  09202 COLLIPULLI
  Shape_Leng Shape_Area total_delitos   pob pond_poblacion del_10000_hab
1   2.906029 0.13808364            38 24458    0.001553684         15.54
2   1.208166 0.04046546            32 12380    0.002584814         25.85
3   1.231271 0.04440834            33 11581    0.002849495         28.49
4   1.466943 0.05865461            31 11914    0.002601981         26.02
5   2.049851 0.12969648           107 34103    0.003137554         31.38
6   2.832457 0.13410231           108 24439    0.004419166         44.19
                        geometry
1 MULTIPOLYGON (((121386.1 57...
2 MULTIPOLYGON (((116508.5 57...
3 MULTIPOLYGON (((154657.2 57...
4 MULTIPOLYGON (((169736.5 57...
5 MULTIPOLYGON (((200422.2 57...
6 MULTIPOLYGON (((195536.1 58...
library(viridis)
del_r09_m <- ggplot() +
  geom_sf(data = comunas_r09, aes(fill = del_10000_hab), alpha=0.8,  size= 0.5)+
  scale_fill_viridis_c()+
  ggtitle("Delitos Violentos en la Región de la Araucanía" ) +
  theme_bw() +
  # theme(legend.position="none")+
  theme(panel.grid.major = element_line(colour = "gray80"), 
        panel.grid.minor = element_line(colour = "gray80"))

del_r09_m

Guardar el Mapa como imagen

ggsave(plot = del_r09_m, filename = "images/map_del_violentos_R09.png", width = 8, height = 7)

Mapa Dinámico

library(mapview)

mapview(comunas_r09, zcol = "del_10000_hab", alpha.regions = 0.9)

3.11 Guardar Resultados

# Excel
write.xlsx(tabla_resumen, file = "data/excel/R09_del_violentos.xlsx")

# Shapefile 
st_write(comunas_r09, "data/shape/R09_del_violentos.shp", delete_dsn = T)

# rds
saveRDS(object = comunas_r09,file = "data/rds/R09_del_violentos.rds")

3.12 Referencias